using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DominioSATT;
using RepositorioSATT;

namespace ServiceSATT
{
    public enum TipoPersona
    {
        Afiliado,
        Arbitro,
        Afiliado_Empleado,
        Empleado
    }
    public class PersonaService:IPersonaService,ITipoPersonaService
    {
        public string ObtenerNombre(int DNI)
        {
            IPersonaRepositorio PersRep = new PersonaRepositorio();
           Persona Persona = PersRep.Obtener(DNI);
           if (Persona != null)
           {
               string NombreCompleto = Persona.Apellido + " " + Persona.Nombre;
               return NombreCompleto;
           }
           return string.Empty;
        }

        public string ObtenerNombre(int DNI, string Tipo)
        {
            IPersonaRepositorio PersRep = new PersonaRepositorio();
            Persona Persona = PersRep.Obtener(DNI);
            if (Persona != null)
            {
                if (Persona.TipoPersona.Contains(Tipo))
                {
                    string NombreCompleto = Persona.Apellido + " " + Persona.Nombre;
                    return NombreCompleto;
                }
            }
            return string.Empty;
        }
        void IPersonaService.ObtenerPersona(IInterfazPersona ui)
        {
            IPersonaRepositorio repositorio =  new PersonaRepositorio();
            Persona Objeto = repositorio.Obtener(ui.Dni);
            if (Objeto != null)
            {
                try
                {
                    ui.Dni = Objeto.Dni;
                    ui.Nombre = Objeto.Nombre;
                    ui.Apellido = Objeto.Apellido;
                    ui.FechaNac = Objeto.FechaNac;
                    ui.Nacionalidad = Objeto.Nacionalidad.Nombre;
                    ui.Direccion = Objeto.Domicilio.Direccion;
                    ui.TipoPersona = Objeto.TipoPersona;
                    ui.Estado = Objeto.Estado;
                    ui.Pais = Objeto.Domicilio.Pais.Nombre;
                    ui.Provincia = Objeto.Domicilio.Provincia.Nombre;
                    ui.Localidad = Objeto.Domicilio.Localidad.Nombre;
                    ui.Telefono = Objeto.Contacto.Telefono;
                    ui.Celular = Objeto.Contacto.Celular;
                    ui.Email = Objeto.Contacto.Email;
                    ui.Sexo = Objeto.Sexo;
                    ui.Relacion = Objeto.Relacion;
                    ui.DniTutor = Objeto.DniTutor;
                }
                catch (Exception ex)
                {
                    throw new ServicioExeption(ex.Message, ex);
                }
            }
            else
                throw new ServicioExeption("El Usuario no existe");
        }
        void IPersonaService.Actualizar(IInterfazPersona ui)
        {
            //Genero Objeto de tipo Pais
            IPaisService pService = new UbicacionService();
            int idPais = pService.BuscarID(ui.Pais);
            Pais nPais = new Pais(idPais, ui.Pais, true);
            int idNacio = pService.BuscarID(ui.Nacionalidad);
            Pais nNac = new Pais(idNacio, ui.Nacionalidad, true);
            
            //Genero Objeto de tipo Provincia
            IProvinciaService prService = new UbicacionService();
            int idProvincia = prService.BuscarID(ui.Provincia);
            Provincia nProv = new Provincia(idProvincia, ui.Provincia, true, nPais);
            
            //Genero Objeto de tipo Localidad
            ILocalidadService lService = new UbicacionService();
            int idLocalidad = lService.BuscarID(ui.Localidad);
            Localidad nLoc = new Localidad(idLocalidad, ui.Localidad, true, nProv);
            
            //Creo una persona y le asigno los datos recuperados del formulario
            Persona PersonaArmada = new Persona();
            PersonaArmada.Dni = ui.Dni;
            PersonaArmada.Nombre = ui.Nombre;
            PersonaArmada.Apellido = ui.Apellido;
            PersonaArmada.Nacionalidad = nNac;
            PersonaArmada.FechaNac = ui.FechaNac;
            PersonaArmada.TipoPersona = ui.TipoPersona;
            PersonaArmada.Sexo = ui.Sexo;
            PersonaArmada.Estado = ui.Estado;
            PersonaArmada.Relacion = ui.Relacion;
            PersonaArmada.DniTutor = ui.DniTutor;
            
            //Creo el Value Object Domicilio y le paso los objetos Pais, Prov y Loc Creados Antes
            PersonaArmada.Domicilio=new Domicilio(nPais, nProv, nLoc, ui.Direccion);
            
            //Creo el el Value Object Contacto y le paso los datos recuperados del formulario
            PersonaArmada.Contacto = new Contacto(ui.Telefono, ui.Celular, ui.Email);

            

            IPersonaRepositorio repositorio = new PersonaRepositorio();
            if (repositorio.Obtener(PersonaArmada.Dni) != null)
            {
                
                repositorio.Actualizar(PersonaArmada);
            }
            else
            {
                repositorio.Agregar(PersonaArmada);
            }
        }
        #region ITipoPersonaService Members

        public List<Persona> ListarTutor()
        {
            ITipoPersonaRepositorio repositorio = new PersonaRepositorio();
            List<Persona> Lista = repositorio.ListarTutores();
            return Lista; 
        }

        public List<Persona> ListarAfiliados()
        {
            ITipoPersonaRepositorio repositorio = new PersonaRepositorio();
            List<Persona> Lista = repositorio.ListarTutores();
            return Lista; 
        }

        #endregion

        #region IPersonaService Members


        public void ListarPersonas(ServiceSATT.ui.IUiListadoPersona ui)
        {
            string tipo = string.Empty;
            switch (ui.Tipo)
            {
                case TipoPersona.Arbitro:
                    tipo = "Arbitro";
                    break;
                case TipoPersona.Empleado:
                    tipo = "Empleado";
                    break;
                case TipoPersona.Afiliado:
                    tipo = "Afiliado";
                    break;
                case TipoPersona.Afiliado_Empleado:
                    tipo = " Afiliado  Empleado";
                    break;
            }
            IPersonaRepositorio repo = new PersonaRepositorio();
            ui.Listado = repo.ListadoPersona(tipo);
        }

        #endregion
    }
}
